package ihm_clarifiee.application;
import ihm_clarifiee.Control.CBacklog;
import ihm_clarifiee.Control.CHistoire;
import ihm_clarifiee.sauvegarde.CareTaker;
import ihm_clarifiee.sauvegarde.Histoire_State;
import ihm_clarifiee.sauvegarde.Originator;

import java.io.File;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.jdom.Attribute;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;
/**
 * @(#) Histoire.java
 */

public class Histoire extends SaveAndRestore<Histoire_State, Histoire>
{	
	private Backlog m_backlog;
	private ArrayList<Tache> m_listeTaches;
	
	private String m_nom;
	private String m_description;
	private int m_duree;
	private Theme m_theme;
	private int m_etat;
	private Sprint m_sprintAssocie;
	
//  XML
	private static org.jdom.Document document;
	private static Element racine;
	
	public Histoire(Backlog backlog, String nom, String descr, int duree, Theme th, int etat)
	{
		this.m_backlog = backlog;
		this.m_description = descr;
		this.m_duree = duree;
		this.m_nom = nom;
		this.m_listeTaches = new ArrayList<Tache>();
		this.m_theme = th;
		this.m_etat = etat;
		this.m_sprintAssocie = null;	
		
//      Sauvegarde
        this.careTaker = new CareTaker<Histoire_State>();
        this.originator = new Originator<Histoire_State>(null);             
	}
	
	public String getNom( )
	{
		return m_nom;
	}
	
	public String getDescription( )
	{
		return m_description;
	}	
	
	public int getDuree( )
	{
		return m_duree;
	}
	
	public Backlog getBacklog(){
		return m_backlog;
	}
	
	public void setNom( String n )
	{
		this.m_nom = n;
	}
	
	public void setDescription( String d )
	{
		this.m_description = d;
	}
	
	public void setDuree( int d )
	{
		this.m_duree = d;
	}
	

	public void addTache(Tache t){
		m_listeTaches.add(t);
	}
	
	public void setTache(Tache t, int i){
		m_listeTaches.set(i, t);
	}
	
	public void removeTache(int i){
		m_listeTaches.remove(i);
	}
	
	public Tache getTache(int i){
		return m_listeTaches.get(i);
	}
	
	public String getTaches(){
		String s = new String("");
		int size =m_listeTaches.size();
		
		for (int i = 0; i<size; i++){
			s+=m_listeTaches.get(i).getTitre()+ ", ";
		}
		
		return s;
	}
	
	public ArrayList<Tache> getListTaches(){
		return m_listeTaches;
	}
	
	public void setListeTaches(ArrayList<Tache> list){
		m_listeTaches=list;
	}
	
	public void setTheme(Theme t){
		m_theme=t;
	}
	
	public Theme getTheme(){
		return m_theme;
	}

	public void associerTheme(Theme t){
		m_theme=t;
	}
	
	public void desassocierTheme( ){
		m_theme=null;
	}

	public int getEtat(){
		return m_etat;
	}
	
	public void setEtat(int etat){
		m_etat = etat;
	}
	@Override
	public void save() {
//		Creation d'un memento et ajout au careTaker
		originator.setState(new Histoire_State(this)); //faire un clone ??
		careTaker.addMemento(originator.saveToMemento());
		Iterator<Tache> it = getListTaches().iterator();
		while(it.hasNext()){
			it.next().save();
		}		
	}

	@Override
	public void saveToXML(String nomRepertoire) {
//		tester si le state != null
		Histoire h_saved = careTaker.getMemento(0).getSaveState().getHistoire();

//		Creation du Document XML avec une racine
        racine = new Element("Histoire");
        racine.setAttribute(new Attribute("titre",h_saved.getNom()));
        document = new Document(racine);
        
		Element nom = new Element("Nom");
		nom.setText(h_saved.getNom());
		racine.addContent(nom);
		
		Element description = new Element("description");
		description.setText(h_saved.getDescription());
		racine.addContent(description);
		
		Element duree = new Element("duree");
		duree.setText(String.valueOf(h_saved.getDuree()));
		racine.addContent(duree);
		
//		Theme : nom & description
		Element theme = new Element("theme");
		racine.addContent(theme);
		
		Element nomT = new Element("nom");
		nomT.setText(h_saved.getTheme().getNom());
		theme.addContent(nomT);
		
		Element descriptionT = new Element("description");
		descriptionT.setText(h_saved.getTheme().getDescription());
		theme.addContent(descriptionT);
		
//		L'état
		Element etat = new Element("etat");
		etat.setText(String.valueOf(h_saved.getEtat()));
		racine.addContent(etat);
		
//		Liste de taches
		Element taches = new Element("Taches");
		taches.setAttribute(new Attribute("taille", String.valueOf(h_saved.getListTaches().size())));
		racine.addContent(taches);
		
		Iterator<Tache> it = getListTaches().iterator();
		while(it.hasNext()){
			Tache tache = it.next();
			Element t = new Element("Tache");
			t.setText(tache.getTitre());
			taches.addContent(t);
//			On la sauvegarde dans son fichier
			tache.saveToXML(nomRepertoire);
		}
		enregistre(nomRepertoire+"/"+h_saved.getNomFichier()+".xml",document);
	}
	
	public static CHistoire restoreFromXML(Backlog bk, String nomFichier, String nomRepertoire){
		
		//On cree une instance de SAXBuilder
		SAXBuilder sxb = new SAXBuilder();

		try
		{
			//On cree un nouveau document JDOM avec en argument le fichier XML
	        //Le parsing est termine ;)
	        document = sxb.build(new File(nomRepertoire+"/"+nomFichier));
	     }
	     catch(Exception e){}

	    //On initialise un nouvel element racine avec l'element racine du document.
	    racine = document.getRootElement();  
	    List<?> l = racine.getChildren();
 	    
		String nom = (String) ((Element) l.get(0)).getText();
		String description = (String) ((Element) l.get(1)).getText();
		int duree = Integer.parseInt(((Element) l.get(2)).getText());
	     
//		Restauration du theme
		List<?> lt = ((Element) l.get(3)).getChildren();
		String nomT  = (String) ((Element) lt.get(0)).getText();
		String descT = (String) ((Element) lt.get(1)).getText();
		Theme theme = new Theme(nomT, descT);
		
//		Restauration de l'état
		int etat= Integer.parseInt((String) ((Element) l.get(4)).getText());
	    CHistoire h_restored = new CHistoire(bk, nom, description, duree, theme, etat);
	    
//	    Restauration de la liste des taches
	    ArrayList<Tache> taches = new ArrayList<Tache>();
		Element liste = (Element) l.get(5);
		List<?> listeTaches= liste.getChildren();
		
		int taille_liste = Integer.valueOf(liste.getAttributeValue("taille"));
		for(int i=0;i<taille_liste;i++){
			taches.add(Tache.restoreFromXML(((Element) listeTaches.get(i)).getText()+".xml", nomRepertoire, h_restored));
		}//for
		
//		Set la liste des taches
		h_restored.setListeTaches(taches);
		
		return h_restored;
	}
	

	@Override
	public void restore() {
		// TODO Auto-generated method stub	
	}

	@Override
	public String getNomFichier() {
		// TODO Auto-generated method stub
		return this.m_nom;
	}

	public void associerSprint(Sprint sprint) {
		if (m_sprintAssocie != null) {
			m_sprintAssocie.m_listeHistoire.remove(this);
		}
		m_sprintAssocie = sprint;		
	}
	
	public Sprint getSprintAssocie(){
		return m_sprintAssocie;
	}

	
}
